{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 这个作业中，我们使用tensorflow来实现一个简单的手写数字识别的网络，并用这个网络来做个 简单的识别示例。\n",
    "- 本作业中，需要参与者应用视频中学到的知识：dropout，learingratedecay，初始化等等，将网络最终在validation数据上的得分尽可能的提高。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 首先导入有用的库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 先看看数据长什么样子 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist=input_data.read_data_sets('./')\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 可以看到images里面有数量不等的图片，每张图片是28x28长度的一个一维向量， 所以用的时候需要先给它还原成28x28的二维图片。labels中则是图片对应的数字的值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4,idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape(28,28))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "- 这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "- 为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=tf.placeholder('float',[None,784])\n",
    "y=tf.placeholder('int64',[None])\n",
    "learning_rate=tf.placeholder('float')\n",
    "\n",
    "def initialize(shape,stddev=0.1):\n",
    "    return tf.truncated_normal(shape,stddev=0.1)\n",
    "\n",
    "L1_units_count=100\n",
    "\n",
    "w_1=tf.Variable(initialize([784,L1_units_count]))\n",
    "b_1=tf.Variable(initialize([L1_units_count]))\n",
    "logits_1=tf.matmul(x,w_1)+b_1\n",
    "output_1=tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10 \n",
    "W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1, W_2) + b_2  \n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。    \n",
    ">试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=y))\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "    learning_rate=learning_rate).minimize(cross_entropy_loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "- 将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- saver用于保存或恢复训练的模型。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.180146, the validation accuracy is 0.8848\n",
      "after 200 training steps, the loss is 0.142324, the validation accuracy is 0.9178\n",
      "after 300 training steps, the loss is 0.441492, the validation accuracy is 0.9232\n",
      "after 400 training steps, the loss is 0.112908, the validation accuracy is 0.933\n",
      "after 500 training steps, the loss is 0.3146, the validation accuracy is 0.9442\n",
      "after 600 training steps, the loss is 0.242804, the validation accuracy is 0.9466\n",
      "after 700 training steps, the loss is 0.349501, the validation accuracy is 0.9508\n",
      "after 800 training steps, the loss is 0.312495, the validation accuracy is 0.9462\n",
      "after 900 training steps, the loss is 0.256465, the validation accuracy is 0.9416\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.9403\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "\n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x576 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        final_pred, acc = sess.run(\n",
    "            [pred, accuracy],\n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 模型的结构是有一层隐藏层的全连接神经网络\n",
    "    - 输入x是将图像按像素展开的784维的向量\n",
    "    - 隐藏层是一层，100个神经元\n",
    "    - 输出是10个结果，对应0-9的数字结果\n",
    "    - 激活函数是Relu\n",
    "    - 损失函数是交叉熵\n",
    "    - 结果做了softmax变换"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 模型参数的更新\n",
    "    - 一次一个batch（32个样本）为一组进行更新，取平均值\n",
    "    - 用反向误差传递算法求取误差cost对权重w的导数\n",
    "    - 用随机梯度下降法更新w\n",
    "    - 学习率是0.3"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- Tensorflow的程序结构主要分两个部分\n",
    "    - 用图来定义一系列运算关系\n",
    "    - 用会话sess.run()来完成图的真实计算\n",
    "- Tensorflow的张量主要有三种\n",
    "    - 常量 constant\n",
    "    - 变量 variable\n",
    "    - 占位符 placeholder"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 模型效果差原因分析\n",
    "    - 可能是网络的隐藏层数较少，没办法更细致的分割类别\n",
    "    - 可能是学习率不合适，更新太慢或者进入局部最小点没有达到真正的极值点\n",
    "    - 可能是训练的次数较少，可以多做几次epoch\n",
    "    - 可能是过拟合，可以在隐藏层后面做dropout"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
